﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data.SqlTypes;

using Noris.Schedule.Support;
using Noris.Schedule.Support.Data;
using Noris.Schedule.Support.Services;
using Noris.Schedule.Support.Sql;
using Noris.Schedule.Support.DataFace;
using Noris.Schedule.Support.Green;
using Noris.Schedule.Support.Core;

using Noris.Schedule.Planning.DataFace;
using System.Drawing;

namespace Noris.Schedule.Planning.ProcessData
{
	// Základna pro plánování materiálu i kapacit, na základě společného plánování toku materiálu přes existující kapacity
	/// <summary>
	/// Základna pro plánování materiálu i kapacit, na základě společného plánování toku materiálu přes existující kapacity
	/// </summary>
	public partial class PlanningDataCls : PlanningComponentCls, IDisposable
	{
		#region LOAD
		/// <summary>
		/// Metoda načte veškerá data aktuálního plánu, bez transakce.
		/// </summary>
		internal override void  DataLoad()
		{
			try
			{
				this._ClearPlanData();
				this.CapacityData.DataLoad();
				this.AxisHeap.DataLoad();
				this.MaterialData.DataLoad();

                this.SetCurrentDataTimestamp();                               // Uloží do this.PlanningParameters otisk hodnot LastSave*, který načte z databáze.
                this.SetPlanningProcessState(PlanningProcessState.PreEdit);   // Nastavím stav Před editací dat. Pokud to nejde, vyhodím chybu.
			}
			catch (Exception exc)
			{
				this._ClearPlanData();
				throw;
			}
			finally
			{
				this.CapacityData.DataLoadEnd();
				this.AxisHeap.DataLoadEnd();
				this.MaterialData.DataLoadEnd();
			}
		}
		#endregion
		#region SAVE
		/// <summary>
		/// Metoda uloží veškerá data aktuálního plánu, interně v jedné transakci.
		/// </summary>
		internal override void DataSave()
		{
            this.SetPlanningProcessState(PlanningProcessState.SavingData);        // Pokud mohu začít ukládat data, nastavím to (stav SavingData) nejen do objektu, ale hlavně i do databáze.

            try
            {
                using (var trans = DataConnect.CreateTransaction())
                {	// Transaction scope:
                    CallProgress(this, 0.00M, "Ukládání stavů kapacit");
                    this.CapacityData.DataSave();

                    CallProgress(this, 0.20M, "Ukládání stavů skladu");
                    this.MaterialData.SaveData();

                    CallProgress(this, 0.40M, "Ukládání plánovacích os");
                    this.AxisHeap.SaveData();

                    CallProgress(this, 0.80M, "Ukládání vztahů kapacit");
                    this.CapacityData.DataSaveCClRel();

                    CallProgress(this, 0.90M, "Ukládání změn výrobních příkazů");
                    this.ProductData.SaveData();

                    this.SetPlanningProcessState(PlanningProcessState.Save);      // Tímto se do objektu i do databáze zapíšou údaje do LastSave*.
                    this.SetCurrentDataTimestamp();                               // Uloží do this.PlanningParameters otisk hodnot LastSave*, který načte z databáze.

                    // Transaction Commit:
                    trans.Commit();
                }
            }
            catch
            {
                // Po chybě nastavím, že data neexistují:
                this.SetPlanningProcessState(PlanningProcessState.NotExist);
                throw;
            }
			finally
            {
                this.Auditor.AuditSaveToTrace();
            }
		}
		#endregion
	}
}
